今日課程範圍
SQL Lesson 3: Queries with constraints (Pt. 2)
https://sqlbolt.com/lesson/select_queries_with_constraints_pt_2
今天我們來學習一個好用的SQL語法GROUP BY & HAVING
當我們想要對以某個項目進行分組 並在分組後再以特定條件進行篩選要如何進行呢?
例如班級躲避球賽 先亂數拆成兩隊 並找出各隊最高的人出來猜拳決定誰先攻
這種先分組再進行條件的限制 便是GROUP BY & HAVING派上用場的地方
想必你一定很好奇 我們先前不是學過可以使用WHERE來進行條件的篩選嗎?
那為什麼這邊要用HAVING 而不用 WHERE 呢?
我們想像一下 亂數拆隊就表示這個是臨時的 並非真正的編制
因此在原始編制的資料中並不實際存在
WHERE 無法使用在這個由GROUP BY 產生的臨時分組數據上
因此就需要用HAVING 語法來進行條件限制
我們實際來練習看看吧
第一題我們要找出所有Artists的人數
並且限制我們不要使用HAVING的寫法
我們可以使用WHERE來限制條件(Role = "Artist")
然後用COUNT()來計算人數
SELECT Role, COUNT(name) AS "Number of Artists" FROM employees
WHERE Role = "Artist"

第二題我們要找出各個Role的人數
因此我們可以使用 GROUP BY 先進行分組
再計算各組的人數即可
SELECT Role,Building,COUNT(name) AS "number of Employees"
FROM employees
GROUP BY Role

第三題稍微複雜一點點
我們要找出Role為工程師的人,與這些人的合計年資
因此 我們一樣先使用GROUP BY 進行分組
然後使用HAVING加入限制條件
最後再計算合計的總年資
SELECT Role,Building,SUM(Years_employed
) AS "total number of years employed" FROM employees
GROUP BY Role
HAVING Role = "Engineer"

今天的練習先到這邊GROUP BY是個相當好用的語法
對於我們在對資料進行分組上有很大的用處
我們明天再繼續